
package DAO;

import models.Curso;
import models.Profesor;
import java.util.Collection;
import javax.persistence.*;
import java.util.Iterator;
import java.util.List;


public class CursoDao {

    protected EntityManager em;

    public Curso crearCurso(int idGrado, String nombreCurso) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();

        Curso c = new Curso();
//        c.setNombreCurso(nombreCurso);
//        c.setIdCurso(0);
//        c.setIdGrado(idGrado);
//        c.setIdProfesor(null);
        em.getTransaction().begin();
        em.persist(c);//con esta funcion lo guarda en la base de datos
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public void borrarCurso(String nombreCurso) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Curso u = em.find(Curso.class, nombreCurso);//en este caso podemos borrar un Curso por nombre
        if (u != null) {//si no lo encuentra por supuesto no lo intenta borrar
            em.remove(u);// borra de la tabla ese registro
            }
        em.getTransaction().commit();
        em.close();
        emf.close();
    }

    public Collection<Curso> encontrarCursosPorGrado(int grado) { //encontrar todos los Cursos
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT u FROM Curso u WHERE u.idGrado=" + grado);
        Collection<Curso> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public Collection<Curso> encontrarCursos() { //encontrar todos los Cursos
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT u FROM Curso u");
        Collection<Curso> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public Collection<Curso> encontrarCursosSinDirector() { //encontrar todos los Cursos
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT u FROM Curso u WHERE idProfesor IS NULL");
        Collection<Curso> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public Collection<Curso> encontrarCursosJoinProfesor(int grado) { //encontrar todos los Cursos

        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT c FROM Curso c JOIN" +
                " c.profesor p WHERE c.idGrado =" + grado + " and p.docProfesor = c.idProfesor");
        Collection<Curso> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public int asignarDirectorAutomatico(Iterator<Profesor> pnd, Iterator<Curso> csd) {
        int cursosActualizados = 0;
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        while (csd.hasNext()) {
//            Curso c = em.find(Curso.class, csd.next().getNombreCurso());
//            c.setIdProfesor(pnd.next().getDocProfesor());
            cursosActualizados++;
        }

        em.getTransaction().commit();
        em.close();
        emf.close();
        return cursosActualizados;
    }

    public Curso asignarDirectorManual(String nombreCurso, Long docProfesor) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Curso c = em.find(Curso.class, nombreCurso);
//        c.setIdProfesor(docProfesor);
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    /****
     * @param idGrado
     * @return
     */
    public List encontrarCursosGrado(int idGrado) {
        List l;
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT c FROM Curso c WHERE c.idGrado=" + idGrado + "");
        List<Curso> lista = query.getResultList();
        em.close();
        emf.close();
        return (lista);

    }

    public Curso encontrarCursoPorNombre(String nombreCurso) {
        Curso curso;
        Query q = em.createQuery("SELECT a FROM Aula a WHERE a.nombreCurso='" + nombreCurso + "'");
        if (q.getResultList().isEmpty() == true) {
            return null;
        } else {
            curso = (Curso) q.getSingleResult();
            return curso;
        }
    }

    public Curso actualizarCurso(Curso curso) {
        Curso cursoActualizado = em.find(Curso.class, curso.getIdCurso());
        if (curso != null) {
            cursoActualizado = curso;
        }
        return cursoActualizado;
    }
}
